package com.seaengine.util
{
	import com.seaengine.net.Int64;
	
	public class StringUtils
	{
		public function StringUtils()
		{
		}

        public static function extractFileNameFromUrl(_path:String):String
        {
            var _fileName:String = "";
            var _len:int = _path.length - 1;
            
            while (_len >= 0 && _path.charAt(_len) != "/" && _path.charAt( _len ) != "\\")
            {                
                _len--;
            }
            
            var fileNameLen:int = (_path.length - 1 ) - _len;
            if ( fileNameLen > 0)
            {
                _fileName = _path.substring((_len + 1), _path.length);
            }
            if(_fileName.indexOf("?")>=0)
            	return _fileName.split("?")[0];
            else
            	return _fileName;
        }
        public static function extractExtensionNameFromFileName(_fileName:String):String
        {        	
        	var _ar:Array = _fileName.split(".");
        	if(_ar.length > 1)
        		return _ar[_ar.length - 1];
        	return "";	
        
        }
        
        public static function extractMainNameFromFileName(_fileName:String):String
        {        	
        	var _ar:Array = _fileName.split("/");
        	if(_ar.length > 1)
        		return String(_ar[_ar.length - 1]).split(".")[0];
        	return _fileName;	
        
        }
        
        //忽略大小字母比较字符是否相等;
		public static function equalsIgnoreCase(char1:String,char2:String):Boolean {
			return char1.toLowerCase() == char2.toLowerCase();
		}
		//比较字符是否相等;
		public static function equals(char1:String,char2:String):Boolean {
			return char1 == char2;
		}
		//是否为Email地址;
		public static function isEmail(char:String):Boolean {
			if (char == null) {
				return false;
			}
			char = trim(char);
			var pattern:RegExp = /(\w|[_.\-])+@((\w|-)+\.)+\w{2,4}+/;
			var result:Object = pattern.exec(char);
			if (result == null) {
				return false;
			}
			return true;
		}
		//是否是数值字符串;
		/*
		public static function isNumber(char:String):Boolean {
			if (char == null) {
				return false;
			}
			return !isNaN(char);
		}
		*/
		//是否为Double型数据;
		public static function isDouble(char:String):Boolean {
			char = trim(char);
			var pattern:RegExp = /^[-\+]?\d+(\.\d+)?$/;
			var result:Object = pattern.exec(char);
			if (result == null) {
				return false;
			}
			return true;
		}
		//getUInt64;
		public static function getUInt64(number:Number):Int64 {
			number=Math.ceil(number);
			var temp:String = number.toString(2);
			var tempHigh:String = temp.substr(0,temp.length-32);
			var tempLow:String = temp.substr(temp.length-32,32);
			var resultInt64:Int64 = new Int64();
			resultInt64.high =  int(parseInt(tempHigh, 2))
			resultInt64.low =  int(parseInt(tempLow, 2))
			return resultInt64;
		}
		//getUInt64;
		public static function getNumberFromUInt64(number:Int64):Number {
			
			var tempHigh:String = number.high.toString(2);
			var tempLow:String = number.low.toString(2);
			var temp:String = "";
			for(var j:int=0;j<(32-tempLow.length);j++)
			{
				temp += "0"; 
			}
			temp = tempHigh + temp + tempLow;
			var result:Number = parseInt(temp, 2)
			return result;
		}
		//Integer;
		public static function isInteger(char:String):Boolean {
			if (char == null) {
				return false;
			}
			char = trim(char);
			var pattern:RegExp = /^[-\+]?\d+$/;
			var result:Object = pattern.exec(char);
			if (result == null) {
				return false;
			}
			return true;
		}
		
		//English;
		public static function isEnglish(char:String):Boolean {
			if (char == null) {
				return false;
			}
			char = trim(char);
			var pattern:RegExp = /^[A-Za-z]+$/;
			var result:Object = pattern.exec(char);
			if (result == null) {
				return false;
			}
			return true;
		}
		//中文;
		public static function isChinese(char:String):Boolean {
			if (char == null) {
				return false;
			}
			char = trim(char);
			var pattern:RegExp = /^[\u0391-\uFFE5]+$/; ;
			var result:Object = pattern.exec(char);
			if (result == null) {
				return false;
			}
			return true;
		}
		//双字节
		public static function isDoubleChar(char:String):Boolean {
			if (char == null) {
				return false;
			}
			char = trim(char);
			var pattern:RegExp = /^[^\x00-\xff]+$/;
			var result:Object = pattern.exec(char);
			if (result == null) {
				return false;
			}
			return true;
		}
		//含有中文字符
		public static function hasChineseChar(char:String):Boolean {
			if (char == null) {
				return false;
			}
			char = trim(char);
			var pattern:RegExp = /[^\x00-\xff]/;
			var result:Object = pattern.exec(char);
			if (result == null) {
				return false;
			}
			return true;
		}
		//注册字符;
		public static function hasAccountChar(char:String,len:uint=15):Boolean {
			if (char == null) {
				return false;
			}
			if (len < 10) {
				len = 15;
			}
			char = trim(char);
			var pattern:RegExp = new RegExp("^[a-zA-Z0-9][a-zA-Z0-9_-]{0,"+len+"}$", "");
			var result:Object = pattern.exec(char);
			if (result == null) {
				return false;
			}
			return true;
		}
		//URL地址;
		public static function isURL(char:String):Boolean {
			if (char == null) {
				return false;
			}
			char = trim(char).toLowerCase();
			var pattern:RegExp = /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/;
			var result:Object = pattern.exec(char);
			if (result == null) {
				return false;
			}
			return true;
		}
		// 是否为空白;        
		public static function isWhitespace(char:String):Boolean {
			switch (char) {
				case " " :
				case "\t" :
				case "\r" :
				case "\n" :
				case "\f" :
					return true;
				default :
					return false;
			}
		}
		//去左右空格;
		public static function trim(char:String):String {
			if (char == null) {
				return null;
			}
			return rtrim(ltrim(char));
		}
		//去左空格; 
		public static function ltrim(char:String):String {
			if (char == null) {
				return null;
			}
			var pattern:RegExp = /^\s*/;
			return char.replace(pattern,"");
		}
		//去右空格;
		public static function rtrim(char:String):String {
			if (char == null) {
				return null;
			}
			var pattern:RegExp = /\s*$/;
			return char.replace(pattern,"");
		}
		//是否为前缀字符串;
		public static function beginsWith(char:String, prefix:String):Boolean {
			return prefix == char.substring(0,prefix.length);
		}
		//是否为后缀字符串;
		public static function endsWith(char:String, suffix:String):Boolean {
			return (suffix == char.substring(char.length - suffix.length));
		}
		//去除指定字符串;
		public static function remove(char:String,remove:String):String {
			return replace(char,remove,"");
		}
		//字符串替换;
		public static function replace(char:String, replace:String, replaceWith:String):String {
			return char.split(replace).join(replaceWith);
		}
		//utf16转utf8编码;
		public static function utf16to8(char:String):String {
			var out:Array = new Array();
			var len:uint = char.length;
			for (var i:uint=0; i<len; i++) {
				var c:int = char.charCodeAt(i);
				if (c >= 0x0001 && c <= 0x007F) {
					out[i] = char.charAt(i);
				} else if (c > 0x07FF) {
					out[i] = String.fromCharCode(0xE0 | ((c >> 12) & 0x0F),
					                                                 0x80 | ((c >>  6) & 0x3F),
					                                                 0x80 | ((c >>  0) & 0x3F));
				} else {
					out[i] = String.fromCharCode(0xC0 | ((c >>  6) & 0x1F),
					                                                 0x80 | ((c >>  0) & 0x3F));
				}
			}
			return out.join('');
		}
		//utf8转utf16编码;
		public static function utf8to16(char:String):String {
			var out:Array = new Array();
			var len:uint = char.length;
			var i:uint = 0;
			while (i<len) {
				var c:int = char.charCodeAt(i++);
				switch (c >> 4) {
					case 0 :
					case 1 :
					case 2 :
					case 3 :
					case 4 :
					case 5 :
					case 6 :
					case 7 :
						// 0xxxxxxx
						out[out.length] = char.charAt(i-1);
						break;
					case 12 :
					case 13 :
						// 110x xxxx   10xx xxxx
						var char1:int = char.charCodeAt(i++);
						out[out.length] = String.fromCharCode(((c & 0x1F) << 6) | (char1 & 0x3F));
						break;
					case 14 :
						// 1110 xxxx  10xx xxxx  10xx xxxx
						var char2:int = char.charCodeAt(i++);
						var char3:int = char.charCodeAt(i++);
						out[out.length] = String.fromCharCode(((c & 0x0F) << 12) |
						                            ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));
						break;
				}
			}
			return out.join('');
		}
	}
}